/*
 * Copyright (C) 2019 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.settings.network;

/// M: Add for receiving broadcasts.
import android.app.Activity;
import android.app.settings.SettingsEnums;
/// M: Add for receiving broadcasts.
import android.content.BroadcastReceiver;
import android.content.Context;
/// M: Add for receiving broadcasts. @{
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
/// @}
import android.os.UserManager;
import android.provider.SearchIndexableResource;
import android.util.Log;

import androidx.annotation.VisibleForTesting;

import com.android.settings.R;
import com.android.settings.Utils;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.search.SearchIndexable;

/// M: Add for supporting SIM hot swap. @{
import com.mediatek.settings.sim.SimHotSwapHandler;
import com.mediatek.settings.sim.SimHotSwapHandler.OnSimHotSwapListener;
/// @}

import java.util.ArrayList;
import java.util.List;

@SearchIndexable(forTarget = SearchIndexable.ALL & ~SearchIndexable.ARC)
public class MobileNetworkListFragment extends DashboardFragment {
    private static final String LOG_TAG = "NetworkListFragment";

    static final String KEY_PREFERENCE_CATEGORY_SIM = "provider_model_sim_category";
    @VisibleForTesting
    static final String KEY_PREFERENCE_CATEGORY_DOWNLOADED_SIM =
            "provider_model_downloaded_sim_category";

    /// M: Add for receiving broadcasts.
    private BroadcastReceiver mReceiver;

    /// M: Add for supporting SIM hot swap.
    private SimHotSwapHandler mSimHotSwapHandler;

    /// M: Add for receiving broadcasts. @{
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);

        mReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                String action = intent.getAction();
                Log.d(LOG_TAG, "onReceive, action=" + action);

                if (action.equals(Intent.ACTION_AIRPLANE_MODE_CHANGED)) {
                    finishActivity("AirplaneMode");
                }
            }
        };

        final IntentFilter intentFilter = new IntentFilter(
                Intent.ACTION_AIRPLANE_MODE_CHANGED);

        getContext().registerReceiver(mReceiver, intentFilter);

        mSimHotSwapHandler = new SimHotSwapHandler(getContext());
        mSimHotSwapHandler.registerOnSimHotSwap(new OnSimHotSwapListener() {
            @Override
            public void onSimHotSwap() {
                finishActivity("onSimHotSwap");
            }
        });
    }

    @Override
    public void onDestroy() {
        getContext().unregisterReceiver(mReceiver);
        mSimHotSwapHandler.unregisterOnSimHotSwap();

        super.onDestroy();
    }

    private void finishActivity(String tag) {
        Activity activity = getActivity();
        if (activity != null) {
            if (activity.isFinishing() || activity.isDestroyed()) {
                Log.d(LOG_TAG, tag + ", activity is finished.");
                return;
            }

            Log.d(LOG_TAG, tag + ", finish Activity.");
            activity.finish();
        }
    }
    /// @}

    @Override
    protected int getPreferenceScreenResId() {
        /// M: Revise for using the fixed resource. @{
        /*
        return Utils.isProviderModelEnabled(getContext())
                ? R.xml.network_provider_sims_list
                : R.xml.mobile_network_list;
        */
        return R.xml.mobile_network_list;
        /// @}
    }

    @Override
    protected String getLogTag() {
        return LOG_TAG;
    }

    @Override
    public int getMetricsCategory() {
        return SettingsEnums.MOBILE_NETWORK_LIST;
    }

    @Override
    protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
        final List<AbstractPreferenceController> controllers = new ArrayList<>();

        /// M: Revise for using the fixed resource. @{
        /*
        if (Utils.isProviderModelEnabled(getContext())) {
            NetworkProviderSimsCategoryController simCategoryPrefCtrl =
                    new NetworkProviderSimsCategoryController(context, KEY_PREFERENCE_CATEGORY_SIM);
            simCategoryPrefCtrl.init(getSettingsLifecycle());
            controllers.add(simCategoryPrefCtrl);

            NetworkProviderDownloadedSimsCategoryController downloadedSimsCategoryCtrl =
                    new NetworkProviderDownloadedSimsCategoryController(context,
                            KEY_PREFERENCE_CATEGORY_DOWNLOADED_SIM);
            downloadedSimsCategoryCtrl.init(getSettingsLifecycle());
            controllers.add(downloadedSimsCategoryCtrl);
        } else {
            controllers.add(new MobileNetworkListController(getContext(), getLifecycle()));
        }
        */
        controllers.add(new MobileNetworkListController(getContext(), getLifecycle()));
        /// @}

        return controllers;
    }

    public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
            new BaseSearchIndexProvider() {

                @Override
                public List<SearchIndexableResource> getXmlResourcesToIndex(Context context,
                        boolean enabled) {
                    final ArrayList<SearchIndexableResource> result = new ArrayList<>();
                    final SearchIndexableResource sir = new SearchIndexableResource(context);
                    /// M: Revise for using the fixed resource. @{
                    /*
                    sir.xmlResId = Utils.isProviderModelEnabled(context)
                            ? R.xml.network_provider_sims_list
                            : R.xml.mobile_network_list;
                    */
                    sir.xmlResId = R.xml.mobile_network_list;
                    /// @}
                    result.add(sir);
                    return result;
                }

                @Override
                protected boolean isPageSearchEnabled(Context context) {
                    return context.getSystemService(UserManager.class).isAdminUser();
                }
            };
}
